ROIPooling

对输入特征图按指定 ROI (Region of Interest) 进行池化操作,将每个 ROI 区域划分为固定大小的池化单元,并取每个通道的最大值输出。

\[ \begin{align}\begin{aligned}\text{pooled\_height} = \left\lceil \frac{\text{roi\_end\_h} - \text{roi\_start\_h} + 1}{\text{pooled\_height}} \right\rceil\\\text{pooled\_width} = \left\lceil \frac{\text{roi\_end\_w} - \text{roi\_start\_w} + 1}{\text{pooled\_width}} \right\rceil\\\text{pooled\_output}[i,j,c] = \max_{h,w \in \text{bin}(i,j)} \text{input}[\text{roi\_start\_h}+h, \text{roi\_start\_w}+w, c]\end{aligned}\end{align} \]

其中:

  • ( text{bin}(i,j) ) 表示第 (i) 行、第 (j) 列池化单元对应的输入特征图区域。

  • (c) 表示通道索引。

输入:
  • in_ptr - 输入特征图地址。

  • input_n - 输入批大小。

  • input_h - 输入高度。

  • input_w - 输入宽度。

  • input_c - 输入通道数。

  • num_rois - ROI 数量。

  • scale - ROI 缩放因子。

  • pooled_height - 池化输出高度。

  • pooled_width - 池化输出宽度。

  • roi - ROI 坐标数组,格式为 [batch_index, x1, y1, x2, y2]。

  • core_mask - 核掩码(仅适用于共享存储版本)。

输出:
  • out_ptr - 池化输出地址。

  • max_c - 每通道最大值缓冲区,用于计算池化结果。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持fp, int8

  • MT7004 支持hp, fp

共享存储版本:

void fp_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const float *in_ptr, float *out_ptr, const float *roi, float *max_c, int core_mask)
void hp_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const half *in_ptr, half *out_ptr, const half *roi, half *max_c, int core_mask)
void i8_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const int8_t *in_ptr, int8_t *out_ptr, const float *roi, int8_t *max_c, int core_mask)

C调用示例:

 1#include <stdio.h>
 2#include <roipooling.h>
 3
 4int main() {
 5    float *input = (float *)0xA0000000;    // 输入在DDR空间
 6    float *output = (float *)0xC0000000;
 7    float max_c[64];                        // 通道数假设为64
 8    float roi[10*5];                         // 10个ROI示例
 9    int num_rois = 10;
10    int core_mask = 0xff;
11
12    fp_roipooling_s(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c, core_mask);
13    return 0;
14}

私有存储版本:

void fp_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const float *in_ptr, float *out_ptr, const float *roi, float *max_c)
void hp_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const half *in_ptr, half *out_ptr, const half *roi, half *max_c)
void i8_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const int8_t *in_ptr, int8_t *out_ptr, const float *roi, int8_t *max_c)

C调用示例:

 1#include <stdio.h>
 2#include <roipooling.h>
 3
 4int main() {
 5    float *input = (float *)0x10810000;    // 输入在L2空间
 6    float *output = (float *)0x10820000;
 7    float max_c[64];
 8    float roi[10*5];
 9    int num_rois = 10;
10
11    fp_roipooling_p(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c);
12    return 0;
13}